// mythread.cc
#include <iostream>
#include <string>
#include <thread>
#include <pthread.h>
#include <unistd.h>
using namespace std;

// 格式化输出十六进制
string toHex(pthread_t tid)
{
    char hex[64];
    snprintf(hex, sizeof(hex), "%p", tid);
    return hex;
}

void *threadRoutine(void *args)
{
    while (true)
    {
        cout << "thread id: " << toHex(pthread_self()) << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

    sleep(1);
    cout << "main thread create thread done, new thread id: " << toHex(tid) << endl;

    pthread_join(tid, nullptr);

    return 0;
}





// void threadrun()
// {
//     while (true)
//     {
//         cout << "I am a new thread for C++" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun);

//     t1.join();

//     return 0;
// }



// class Request
// {
// public:
//     Request(int start, int end, const string &threadname)
//         : _start(start), _end(end), _threadname(threadname)
//     {
//     }

//     int run()
//     {
//         int ret = 0;
//         for (int i = _start; i <= _end; ++i)
//         {
//             cout << _threadname << " is running, calling..., " << i << endl;
//             ret += i;
//             usleep(100000);
//         }
//         return ret;
//     }

// public:
//     int _start;
//     int _end;
//     string _threadname;
// };

// class Response
// {
// public:
//     Response(int result = 0, int exitcode = 0)
//         : _result(result), _exitcode(exitcode)
//     {
//     }

// public:
//     int _result;   // 计算结果
//     int _exitcode; // 计算结果是否可靠
// };

// // 线程的参数和返回值，不仅仅可以用来传递一般参数，也可以传递对象！
// void *sumCount(void *args)
// {
//     Request *rq = static_cast<Request *>(args); // Request *rq = (Request*)args
//     Response *rsp = new Response;
//     rsp->_result = rq->run();  // 可以直接在类里实现计算方法，这里直接调用，面向对象
//     // for (int i = rq->_start; i <= rq->_end; ++i)
//     // {
//     //     cout << rq->_threadname << " is running, calling..., " << i << endl;
//     //     rsp->_result += i;
//     //     usleep(100000);
//     // }
//     delete rq;
//     return rsp;
// }

// int main()
// {
//     pthread_t tid;
//     Request *rq = new Request(1, 100, "thread 1");
//     pthread_create(&tid, nullptr, sumCount, rq);

//     void *ret;
//     pthread_join(tid, &ret);
//     Response *rsp = static_cast<Response *>(ret);
//     cout << "rsp->result: " << rsp->_result << ", rsp->exitcode: " << rsp->_exitcode << endl;
//     delete rsp;

//     return 0;
// }

// // Thread 1
// void *threadRoutine(void *args)
// {
//     const char *name = (const char *)args;
//     int cnt = 5;
//     while (cnt--)
//     {
//         cout << name << ": " << getpid() << endl;
//         sleep(1);
//     }

//     // exit(11);  // exit是用来终止进程的，不能用来终止线程
//     // return (void*)1;  // 走到这里默认线程退出
//     // pthread_exit((void *)100);  // 表示线程终止
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void *)"Thread 1");

//     sleep(1);  // 只是为了保证新线程已经启动
//     pthread_cancel(tid);

//     // 线程等待
//     void *retval;
//     pthread_join(tid, &retval); // 主线程等待的时候，默认是阻塞等待的

//     // 指针是8字节的，如果强转成int，会发生截断，g++会编译错误，所以转成long long int
//     cout << "main thread quit..., ret: " << (long long int)retval << endl;
//     return 0;
// }

// // new thread
// void *threadRoutine(void *args)
// {
//     while (1)
//     {
//         cout << "new thread: " << getpid() << endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, nullptr);

//     while (1)
//     {
//         printf("main thread: %d, new thread tid: %p\n", getpid(), tid);
//         sleep(1);
//     }
//     return 0;
// }

// // 全局变量被多个执行流共享
// int g_val = 100;

// // 可以被多个执行流同时执行，show函数被重入
// void show(const string &name)
// {
//     cout << name << "say# " << "hello thread" << endl;
// }

// // new thread
// void *threadRoutine(void *args)
// {
//     while (1)
//     {
//         printf("new thread: %d, g_val: %d, &g_val: 0x%p\n", getpid(), g_val, &g_val);
//         // cout << "new thread: " << getpid() << endl;
//         // show("[new thread]");
//         sleep(2);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, nullptr);

//     while (1)
//     {
//         printf("main thread: %d, g_val: %d, &g_val: 0x%p\n", getpid(), g_val, &g_val);
//         // cout << "main thread: " << getpid() << endl;
//         // show("[main thread]");
//         sleep(2);
//         ++g_val;
//     }
//     return 0;
// }